package com.behome.common.utils.file;

import com.coremedia.iso.IsoFile;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.TimeZone;

/**
 * VideoUtil 视频文件时长计算工具类
 *
 * @author bh_ljy
 * @version 2024/04/24 17:45
 **/
public class VideoUtil {

    /**
     * 获取视频文件的播放长度(mp4、mov格式)
     *
     * @param videoPath 视频文件路径
     * @return 单位为毫秒
     */
    public static long getMp4Duration(String videoPath) throws IOException {
        IsoFile isoFile = new IsoFile(videoPath);
        long lengthInSeconds =
                isoFile.getMovieBox().getMovieHeaderBox().getDuration() /
                        isoFile.getMovieBox().getMovieHeaderBox().getTimescale();
        return lengthInSeconds;
    }


    /**
     * 得到语音或视频文件时长,单位秒
     *
     * @param filePath 语音或视频文件路径
     */
    public static String getDuration(File filePath) throws IOException {
        String format = getVideoFormat(filePath.getAbsolutePath());
        long result = 0;
        switch (format) {
            case "wav":
                result = AudioUtil.getDuration(filePath.getAbsolutePath()).intValue();
                break;
            case "mp3":
                result = AudioUtil.getMp3Duration(filePath.getAbsolutePath()).intValue();
                break;
            case "m4a":
            case "mov":
            case "mp4":
                result = VideoUtil.getMp4Duration(filePath.getAbsolutePath());
                break;
        }
        SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
        formatter.setTimeZone(TimeZone.getTimeZone("GMT+00:00"));
        return formatter.format(result * 1000);
    }

    /**
     * 得到语音或视频文件时长,单位秒
     *
     * @param filePath 语音或视频文件路径
     */
    public static long getDuration(String filePath, String format) throws IOException {
        long result = 0;
        if ("wav".equals(format)) {
            result = AudioUtil.getDuration(filePath).intValue();
        } else if ("mp3".equals(format)) {
            result = AudioUtil.getMp3Duration(filePath).intValue();
        } else if ("m4a".equals(format)) {
            result = VideoUtil.getMp4Duration(filePath);
        } else if ("mov".equals(format)) {
            result = VideoUtil.getMp4Duration(filePath);
        } else if ("mp4".equals(format)) {
            result = VideoUtil.getMp4Duration(filePath);
        }

        return result;
    }


    /**
     * 得到文件格式
     */
    public static String getVideoFormat(String path) {
        return path.toLowerCase().substring(path.toLowerCase().lastIndexOf(".") + 1);
    }
}
